%%%%% операции над множествами
-module(set).
-export([cross/2, diff/2, join/2, empty/1, get_el/1, add/2]).

%%% получить элемент множества
get_el([Head| _])->
    Head.

%%% возвращает true, если множество пустое
empty([])->
    true;
empty(_)->
    false.

%%% добавить элемент в множество
add(E,S)->
    join([E],S).

%%% пересечение
cross(A,B)->
    cross(A,B,[]).
cross(_,[],C)->
    C;
cross([],_,C)->
    C;
cross([H1 | T1], [H2 | T2],C) ->
    if 
	H1==H2->
	    cross(T1, T2, C++[H1]);
	H1>H2 -> cross( [H1|T1], T2, C);
	H1<H2 -> cross( T1, [H2 | T2], C);
	true -> ok
    end.

%%% разность
diff(A,B)->
    A -- B.

%%% объединение
join(A,B)->
    join(A,B,[]).
join(L, [],C)->
    C++L;
join([],L,C) ->
    C++L;
join([H1 | T1], [H2 | T2], C) ->
    if
	H1==H2->
	    join(T1,T2, C++[H1]);
	H1<H2 ->
	    join(T1, [H2|T2], C++[H1]);
	H1>H2 ->
	    join([H1|T1], T2, C++[H2])
    end.
